package com.example.service.impl;

import com.example.service.UserService;
import com.example.token.MyToken;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    public void checkLogin(String userName, String userPassword, boolean rememberMe, String loginType) throws Exception {
        /**
         * 获取当前用户主体
         */
        Subject subject = SecurityUtils.getSubject();
        /**
         * 创建认证 token
         */
//        UsernamePasswordToken token = new UsernamePasswordToken(userName, userPassword);
        /**
         * 使用自定义 Token
         */
        MyToken token = new MyToken(userName, userPassword, loginType);
        /**
         * Shiro 的 RememberMe（记住我）机制
         */
        token.setRememberMe(rememberMe);
        /**
         * 进入 Shiro 的认证过程（此时 Realm 开始发挥作用）
         * 当调用 subject.login(token) 时，Shiro 执行以下过程：
         * 1.从 SecurityUtils.getSubject() 获取当前线程绑定的 Subject。
         * 2.调用 subject.login(token) 会触发 SecurityManager.login()。
         * 3.SecurityManager 会将认证请求委托给内部的 Realm（你的配置中使用了 JdbcRealm）。
         * 4.JdbcRealm 会通过查询数据库验证用户名和密码是否匹配（你需要配置好数据源和 SQL 查询）。
         * ⚠️：**这一步是业务代码触发的，不是由过滤器触发的！**是在你手动调用 login() 方法时才会进入。
         */
        subject.login(token);
    }

}
